package multiThread.security;

/**
 * @projectName: java-sample
 * @description:
 * @author: Adam
 * @create: 2020-01-06 20:51
 **/

/**
 * 关键字volatile可以用来修饰字段（成员变量）,就是告知程序任何对该变量的访问均需要从共享内存中获取，而对它的改变必须同步刷新回共享内存，它能保证所有线程对变量访问的可见性
 * volatile boolean on = true ,这样其他线程对它进行改变时，可以让所有线程感知到变化，因为所有对on变量的访问和修改都需要以共享内存为准。但是过多的使用volatile是不必要的，
 * 因为它会降低程序的执行效率;
 * 关键字synchronized可以修饰方法或者以同步块的形式来进行使用，它主要确保多个线程在同一个时刻，只能有一个线程处于方法或同步块中，它保证了线程对变量访问的可见性和排他性
 */
public class SecurityDemo {

    public int i = 0;

    public void setI(int i){
        this.i = i;
    }

    public int getI(){
        return i;
    }

    public static void main(String[] args) {
          SecurityDemo securityDemo = new SecurityDemo();
          new Thread1(securityDemo).start();
          for (int i = 0; i <20 ; i++) {
            new Thread2(securityDemo).start();
          }
    }
}
